/**
 * UtilidadesCapaDatos.java
 */

 /**
 *  AdSec: Administrador de Secundarias
 *  Copyright (C) 2009 Daniela Ramírez Chaves (dannyrch@gmail.com)
 *  Copyright (C) 2009 Leonel Salazar Valverde (leo87sv@gmail.com)
 *
 *  This file is part of AdSec.
 *  AdSec is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  AdSec is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with AdSec.  If not, see <http://www.gnu.org/licenses/>.
 */

package adsec.datos;

import java.sql.Timestamp;
import java.sql.Connection;
import java.sql.Date;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.LinkedList;
import adsec.entidades.LlaveValor;


public class UtilidadesCapaDatos {

    public final static String CEDULA_INVALIDA = "0-0000-0000";
    
    public UtilidadesCapaDatos(){
    }

    public static String agregarParametros(int cantidad){
        StringBuffer parametro = new StringBuffer("(");
        for(int i = 0; i < cantidad-1; i++ ){
            parametro.append("?,");
        }
        parametro.append("?)");
        return parametro.toString();
    }

    /**
     ** Retorna un booleano que indica si en la tabla nombreTabla existe una tupla
     ** con la llave indicada en valorLlave
     ** @param nombreTabla el nombre de la Tabla en la cual buscar
     ** @param nombreLlave el nombre de la llave de la Tabla
     ** @param valorLlave el valor de la llave a consultar
     ** @return true si el existe una tupla cuya llave tiene como valor valorLlave
     **/
    public static boolean existeLlave(String nombreTabla, String nombreLlave, String valorLlave){
        boolean existe = false;
        AdministradorConexion adminConexion = AdministradorConexion.getInstancia();
        Connection conexion = adminConexion.getConexion();
        if(conexion != null){
            try{
                Statement procedimiento = conexion.createStatement();
                if(procedimiento != null){
                    String query = new String("SELECT "+ nombreLlave +
                            " FROM " + nombreTabla + " WHERE " + nombreLlave + " = " +
                            "'" + valorLlave + "';");
                    System.out.println(query);
                    ResultSet resultado = procedimiento.executeQuery(query);

                    if(resultado.next()){
                        System.out.println(resultado.getObject(1));
                        existe = true;
                    }
                }
            }catch(SQLException e){
                e.printStackTrace();
            }//fin de try catch
        }//fin de if
        else{
            System.out.println("no hubo conexión");
        }//fin de else
        adminConexion.cerrarConexion();
        return existe;
    }//fin de existeLlave

    /**
     ** Retorna un booleano que indica si en la tabla nombreTabla existe una tupla
     ** con la llave indicada en valorLlave
     ** @param nombreTabla el nombre de la Tabla en la cual buscar
     ** @param nombreLlave el nombre de la llave de la Tabla
     ** @param valorLlave el valor de la llave a consultar
     ** @return true si el existe una tupla cuya llave tiene como valor valorLlave
     **/
    public static boolean existenLlaves(String nombreTabla, LinkedList<LlaveValor> listaLlavesValor){
        boolean existe = false;
        if(listaLlavesValor != null && listaLlavesValor.size() > 0){
            AdministradorConexion adminConexion = AdministradorConexion.getInstancia();
            Connection conexion = adminConexion.getConexion();
            if(conexion != null){
                try{
                    Statement procedimiento = conexion.createStatement();
                    if(procedimiento != null){

                        Iterator<LlaveValor> iterador = listaLlavesValor.iterator();
                        StringBuffer query = new StringBuffer();
                        StringBuffer querySelect = new StringBuffer("SELECT ");
                        StringBuffer queryWhere = new StringBuffer(" WHERE ");
                        int restantes = listaLlavesValor.size();

                        while(iterador.hasNext()){
                            LlaveValor llaveValor = iterador.next();
                            querySelect.append(llaveValor.getNombreLlave());
                            queryWhere.append(llaveValor.getNombreLlave() +
                                    " = '" + llaveValor.getValor() + "'");
                            restantes--;
                            if(restantes > 0){
                                querySelect.append(",");
                                queryWhere.append(" AND ");
                            }
                        }//fin de while
                        query.append(querySelect);
                        query.append(" FROM " + nombreTabla);
                        query.append(queryWhere + ";");
                        System.out.println(query.toString());
                        ResultSet resultado = procedimiento.executeQuery(query.toString());

                        if(resultado.next()){
                            System.out.println(resultado.getObject(1));
                            existe = true;
                        }
                    }//fin de if
                }catch(SQLException e){
                    e.printStackTrace();
                }//fin de try catch
            }//fin de if
            else{
                System.out.println("no hubo conexión");
            }//fin de else
            adminConexion.cerrarConexion();
        }//fin de if
        
        return existe;
    }//fin de existenLlaves

    public static Date convertirDate(Timestamp tiempo){
        return new Date(tiempo.getTime());
    }

}//fin de UtilidadesCapaDatos
